Программирование маплетов

Объекты общего назначения пакета Elements

        Контейнеры верхнего уровня

Маплет

        Команда Maplet[alias](opts, elem) определяет невизуальный объект, называемый маплетом, который является внешним контейнером и полностью инкапсулирует в себя весь код создаваемого приложения. Выводится маплет в окно, формируемое или отдельной командой Window или создаваемое по умолчанию списком […]. Необязательный параметр alias в A – псевдоним маплета, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       onstartup = str. Опция onstartup (на старте) значением str задает Action-элемент, псевдоним Action-элемента или команду. В любом случае str определяет совокупность действий, которые должны быть выполнены сразу при запуске маплета;

·       abnormalshutdown = str. Опция abnormalshutdown (анормальный, аварийный) строкой str задает значение, которое должно быть выведено при ненормальном завершении работы с маплетом, например, по кнопке Close (´);

·       reference = ref. Назначение псевдонима для маплета.

        Заметим, что среди перечисленных опций нет тех, которые необходимо указывать в A. Кроме того, их значения нельзя задавать командами SetOption и Set или считывать командой Get.

        Пример 1. Здесь демонстрируется возможность анимации в маплете. Опция image объекта Label ссылается на Image-объект, который является анимационным gif-файлом. На рисунке представлены три из выводимых по маплету анимационных кадров.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt :=  Maplet(

{Shift+¿}

 

       [Label(image=IM1)],

{Shift+¿}

 

        Image[IM1]("E:\\D_1\\Pictures\\email.gif")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

 

 

 

 

 

 

 

 

 

Окно

        Команда Window[alias](opts) определяет объект “окно”, который непосредственно вкладывается в объект Map­let. Необязательный параметр alias – псевдоним окна, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       title = ti. Формирование заголовка окна. По умолчанию ti = Maplet;

·       width = w. Установка ширины окна в пикселах;

·       height = h. Установка высоты окна в пикселах;

·       resizable = res. Опция resizable значением res задает возможность изменения мышью размеров окна (res = true) или отменяет ее (res = false);

·       xcoord = nux. Опция xcoord числовым значением nux задает величину  отступа окна от левого края экрана в пикселах. По умолчанию по горизонтали окно центрируется;

·       ycoord = nuy. Опция ycoord числовым значением nuy задает величину  отступа окна от верхнего края экрана в пикселах. По умолчанию по вертикали окно центрируется;

·       visible = bo. Задание режима видимости окна;

·       defaultbutton = db. Опция defaultbutton (кнопка по умолчанию) значением db задает объект типа Button, который выполняется при нажатии ключа {Enter}. Если опция defaultbutton не определена, то кнопкой, выполняемой по ключу {Enter} назначается первая из определенных в окне кнопок Button;

·       menubar = mb. Опция menubar значением mb задает объект типа MenuBar или ссылку на него. По этой опции в маплете выводится основное меню окна;

·       toolbar = tb. Опция toolbar значением tb задает объект типа ToolBar или ссылку на него. По этой опции в маплете выводится инструментальная панель окна;

·       layout = la. Опция layout значением la задает объект, определяющий схему размещения компонентов внутри окна маплета, или ссылку на такой объект;

·       reference = ref. Назначение псевдонима для окна.

        В таблице 1 знаком “+” указаны допустимые правила использования опций в команде Window: С – опцию можно указывать в Window; N – опцию нужно указывать в Window; S – опцию можно задавать командами SetOption или Set; G – значение опции можно прочитать командой Get.

Таблица 1

Допустимые правила использования опций в команде Window

     

          Опции

 

 

Правила

title

width

height

resizable

xcoord

ycoord

visible

defaultbutton

menubar

toolbar

layout

reference

C (можно)

+

+

+

+

+

+

 

+

+

+

+

+

N (нужно)

 

 

 

 

 

 

 

 

 

 

+

 

S (SetOption)

+

+

+

+

+

+

 

 

 

 

 

 

G (Get)

+

+

+

+

+

+

+

 

 

 

 

 

        Пример 2. Здесь демонстрируется маплет с двумя окнами WI1 и WI2. Первое из них открывается при запуске маплета, что зафиксировано его опцией onstartup = RunWindow(WI1). По кнопке с надписью “Run Second Window” открывается второе окно WI2. Чтобы окна не перекрывали друг друга, WI2 с помощью опции xcoords выводится со сдвигом по горизонтали. Закрывается WI2 кнопкой “Close This Window”. При закрытии маплета аварийной кнопкой Close (´) окна WI1 возвращается строка “Close x”, как это и предписано опцией abnormalshutdown.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   onstartup = RunWindow(WI1),

{Shift+¿}

 

   abnormalshutdown = "Close x",

{Shift+¿}

 

   Window[WI1](First,

{Shift+¿}

 

       [Button("Run Second Window", RunWindow(WI2)),

{Shift+¿}

 

        Button("Quit", Shutdown("WI1"))]),

{Shift+¿}

 

   Window[WI2](Second, xcoord = 490,

{Shift+¿}

 

       [Button("Close This Window", CloseWindow(WI2))])):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Открытие и закрытие окон и маплета

Открытие и закрытие окон

        Команда RunWindow(opt) открывает окно Window, определен­ное в текущем маплете. Элемент RunWindow можно задавать в объектах маплета в опциях onapprove, oncancel, onchange, onclick, ondecline, onstartup и в объекте Action. Окна, открываемые командой A – это те или иные диалоги. Объекты этих диалогов и их свойства задаются пользователем. Этим они отличаются от предопределенных диалогов с фиксированным набором объектов, у которых пользователь может изменять лишь их свойства. Единственно возможная опция для объекта RunWindow – это window = ref, по которой значением ref организуется ссылка на открываемый объект Window. Опцию window = ref указывать необходимо, но не обязательно вместе с ключевым словом window. Кроме того, ее значение нельзя задавать командами SetOption и Set или считывать командой Get. Заметим, что открытие окна, расположенного вне текущего маплета, реализуется не по A, а командой Maplets[Display].

        Команда CloseWindow(opt) закрывает окно Window, определенное и открытое в текущем маплете командой A. Элемент CloseWindow можно задавать в тех же объектах, что и RunWindow. Единственная опция у CloseWindow – это window = ref, по которой значением ref организуется ссылка на закрываемый объект Window. Все, что сказано про опцию window, для  RunWindow остается справедливым и в данном случае. Заметим, что при закрытии окна по B одновременно закрываются и все окна-потомки.

        Команда RunDialog(opt) открывает окно предопределенного диалога. Элемент RunDialog можно задавать в объектах маплета в опциях onapprove, oncancel, onchange, onclick, ondecline, onstartup и в объекте Action. Единственно возможная опция для объекта RunDialog – это dialog = ref, по которой значением ref организуется ссылка на открываемый диалог. Опцию dialog = ref указывать необходимо, но не обязательно вместе с ключевым словом dialog. Кроме того, ее значение нельзя задавать командами SetOption и Set или считывать командой Get. Заметим, что открытие окна, расположенного вне текущего маплета, реализуется не по C, а командой Maplets[Display].

        Пример 3. Здесь демонстрируется взаимодействие двух маплетов. В первом из них имеются три окна (MAIN, SWIN1 и SWIN2) и три кнопки Button (BT1, BT2 и BT3). Главное окно MAIN этого маплета открывается на старте командой RunWindow(MAIN). Оно приведено на рисунке слева. Кнопкой BT1 с помощью команды RunWindow(SWIN1) открывается окно SWIN1 с первой картинкой и кнопкой закрытия с надписью Quit1. Кнопкой BT2 с помощью команды RunWindow(SWIN2) открывается окно SWIN2 со второй картинкой и кнопкой закрытия с надписью Quit2. На рисунке указанные картинки не представлены. По кнопке BT3 командой Maplets[Display](mto) запускается на выполнение второй маплет и в его окне появляется третья картинка и кнопка закрытия Quit. Эта картинка приведена на рисунке справа. Окна SWIN1 и SWIN2 закрываются кнопками Button по командам CloseWindow(SWIN1) и CloseWindow(SWIN2) соответственно.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(onstartup = RunWindow(MAIN),

{Shift+¿}

 

   Window[MAIN](layout = LA1),

{Shift+¿}

 

      BoxLayout[LA1](border = true, background = gray,

{Shift+¿}

 

         [[[Button[BT1]("Picture 1", RunWindow(SWIN1))],

{Shift+¿}

 

           [Button[BT2]("Picture 2", RunWindow(SWIN2))],

{Shift+¿}

 

           [Button[BT3]("Picture 3",

{Shift+¿}

 

            Evaluate(function =

{Shift+¿}

 

               'Maplets[Display](mto)'))]],

{Shift+¿}

 

          Button[BT4]("Exit", Shutdown())]),

{Shift+¿}

 

   Window[SWIN1]([Label(image = IM1),

{Shift+¿}

 

      Button("Quit1", CloseWindow(SWIN1))]),

{Shift+¿}

 

   Window[SWIN2]([Label(image = IM2),

{Shift+¿}

 

      Button("Quit2", CloseWindow(SWIN2))]),

{Shift+¿}

 

   Image[IM1]("E:\\D_1\\Pictures\\pro1.jpg"),

{Shift+¿}

 

   Image[IM2]("E:\\D_1\\Pictures\\pro5.jpg")):

{Shift+¿}

 

   mto :=  Maplet(                                             # второй маплет

{Shift+¿}

 

     [Label(image = IM1), Button("Quit", Shutdown())],

{Shift+¿}

 

      Image[IM1]("E:\\D_1\\Pictures\\pro4.jpg")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

 

 

 

Закрытие маплета

        Команда Shutdown(opts) закрывает маплет. Необязательные аргументы opts – опции. Они напрямую, ссылками на невизуальные объекты Return или ссылками на иные объекты определяют то, что возвращается из маплета в Maple-сессию, и могут быть такими:

·       value = str. Опция value строкой или литералом без пробелов str задает возвращаемое строковое значение;

·       `return` = ref. Опция return по псевдониму ref объекта Return возвращает список строковых значений опций различных объектов. В Return должно быть предусмотрено, о каких объектах и каких опциях идет речь. Подробно об объекте Return рассказывается в следующем пункте.

        Замечание. Вместо опции return возвращаемые значения можно задавать списками ссылок на конкретные объекты маплета в виде [ref], [ref(opt)] или [a1, a2, …, an], где ak (k = 1, 2, …, n) элементы типа ref или ref(opt). В первом случае для объекта с псевдонимом ref возвращается список из одного строкового значения опции value. Во втором случае для объекта с псевдонимом ref возвращается список из одного строкового значения опции opt. В третьем случае для списка объектов ak возвращается список значений соответствующих опций.

        Если опции отсутствуют, то возвращается значение NULL. Если присутствуют обе опции, то возвращается последовательность из двух элементов. Первый из них есть значение, возвращаемое по value, а второй – значение, возвращаемое по return. Значения опций нельзя задавать командами SetOpti­on и Set или считывать командой Get.

        Элемент Shutdown может находиться в объектах маплета в опциях onapprove, oncancel, onchange, onclick, ondecline, onstartup и в объекте Action.

        Пример 4. Здесь демонстрируется тестовый пример на возвращаемые значения. В маплете имеются следующие объекты:

·       IM1 – графический образ (Image);

·       LA1 – метка (Label), на которую выведен графический образ IM1;

·       CB1 – первый независимый переключатель (CheckBox);

·       CB2 – второй независимый переключатель (CheckBox);

·       TF1 – текстовое поле ввода (TextField);

·       RE1 – невизуальный объект вывода (Return);

·       кнопка общего назначения с надписью “Ok”.

        В соответствии с командой Shutdown по кнопке “Okмаплет закрывается и выводит последовательность из текста “qwerty” и списка [“test”], то есть значения опции value текстового поля TF1. Уточнить понимание синтаксиса и семантики объекта Shutdown можно, экспериментируя с его аргументом. Образцы тестовых примеров находятся за текстом маплета. 

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(Window(layout = BR1, title = "Diagram"),

{Shift+¿}

 

  BoxRow[BR1](

{Shift+¿}

 

     Label[LA1](image = IM1),

{Shift+¿}

 

     BoxColumn([CheckBox[CB1]("Check 1", value = true),

{Shift+¿}

 

                          CheckBox[CB2]("Check 2")],

{Shift+¿}

 

                          TextField[TF1]("test")),

{Shift+¿}

 

     Button("Ok", Shutdown("qwerty", [TF1]))),

{Shift+¿}

 

     Return[RE1](

{Shift+¿}

 

        ReturnItem(item = CB1),

{Shift+¿}

 

        ReturnItem(item = CB1, `option` = background),

{Shift+¿}

 

        ReturnItem(item = TF1, `option` = width)),

{Shift+¿}

 

     Image[IM1]("E:\\D_1\\Pictures\\diagram.gif")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

 

"qwerty", ["test"]

Тестовые примеры (аргумент Shutdown ® возвращаемые значения): 

1)

пусто

®

NULL (пусто);

2)

"qwerty"

®

"qwerty";

3)

[CB1]

®

["true"];

4)

[CB1, CB2]

®

["true", "false"];

5)

"qwerty", [TF1]

®

"qwerty", ["test"];

6)

[CB1(caption), CB2, TF1(width)]

®

["Check 1", "false", "20"];

7)

[LA1]

®

ошибка (опции value у метки нет);

8)

[LA1(caption), IM1(reference)]

®

["", "_Maplets_reference_110"];

9)

`return` = RE1

®

["true", "#ECE9D8", "20"].

        Пример 5. Пусть требуется получить точное шестнадцатеричное RGB представление цвета фона окон маплетов. Поскольку опция background у объекта Window отсутствует, а по цвету фон объектов Label (метка) и Window одинаков, то сделать это можно, например, так:

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   [[Label[LA1]("color test"),

{Shift+¿}

 

     Button("Ok", Shutdown([LA1(background)]))]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Значения, возвращаемые маплетом

        Команда Return[alias](opt, elem) определяет невизуальный объект Return, который можно включать только в объект Maplet. По ссылке из команды Shutdown на псевдоним Return выводится список строковых значений конкретных опций требуемых объектов маплета при его закрытии. Заметим, что при прямой ссылке из Shutdown на объекты маплета возвращаются лишь текущие значения их опций value. Аргумент elem представляет собой последовательность объектов ReturnItem, которые в совокупности и задают все то, что должно быть выведено. Аргумент opt – это единственная возможная опция reference = ref, определяющая псевдоним Return, если он еще не задан параметром alias.

        Команда ReturnItem(opts) определяет невизуальный объект ReturnItem, который можно включать только в объект Return. В ReturnItem опциями opts указываются данные об объектах маплета, которые должны быть выведены при завершении работы с ним. Возможные опции и их значения таковы:

·       item = ref. Опция item значением ref задает ссылку на некоторый объект маплета. Если вторая опция `option` не задана, то по item форсируется вывод значения опции value указанного объекта;

·       `option` = name. Опция `option` параметром name задает имя опции некоторого объекта маплета. По `option` форсируется вывод значения опции с именем name. При этом опция item также должна быть задана.

        Значения обеих опций нельзя задавать командами SetOption и Set или считывать командой Get.

        Пример 6. Здесь демонстрируется маплет с выводом по Return текущих значений опций некоторых объектов. В ShutDown на Return задана ссылка. В Return определены три айтема ReturnItem. По первому айтему для текстового поля TF1 назначается вывод значения опции value, то есть текста, который будет введен в это поле. По второму айтему для этого же поля назначается вывод значения опции width, то есть ширины этого поля. По третьему айтему для метки LA1 назначается вывод значения опции caption, то есть надписи метки.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   BoxRow(background = gray, border = true,

{Shift+¿}

 

      Label[LA1]("Text ?"),

{Shift+¿}

 

      TextField[TF1](),

{Shift+¿}

 

      Button("Ok", Shutdown(`return` = RE1))),

{Shift+¿}

 

   Return[RE1](

{Shift+¿}

 

      ReturnItem(item = TF1),

{Shift+¿}

 

      ReturnItem(item = TF1, `option` = width),

{Shift+¿}

 

      ReturnItem(item = LA1, `option` = caption))):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Шрифты, рисунки и группы кнопок

Шрифт

        Команда Font[alias](opts) определяет невизуальный объект Font (шрифт). Его можно задавать в командах Button, ToggleButton, Label, TextBox, TextField, CheckBox, RadioButton, ListBox, DropDownBox, ComboBox, Menu и Table напрямую или ссылкой на псевдоним. В последнем случае объект Font должен быть непосредственно вложен в контейнер Maplet (но не в Window) и на него может быть много ссылок. Объект Font задает характеристики текста соответствующих объектов. Необязательный параметр alias в A – псевдоним шрифта, аргументы opts – опции, которые в данном случае могут быть такими:

·       family = fa. Задание имени шрифта. Шрифты helvetica, times, courier и symbol доступны всегда. Если шрифт с указанным именем не найден, то выводится соответствующее сообщение, а используется шрифт, установленный в системе по умолчанию. Кроме того, щелчок по кнопке “Valid font …” (допустимый шрифт) дает возможность просмотреть имена всех шрифтов системы;

·       bold = bo. Установка типа жирности шрифта. При bo = true шрифт жирный, при bo = false – нормальный;

·       italic = bo. Установка типа наклона шрифта. При bo = true шрифт наклонный, при bo = false – прямой;

·       size = nu. Установка размера шрифта в точках. По умолчанию nu = 10;

·       reference = ref. Назначение псевдонима для рисунка.

        Заметим, что опцию family указывать обязательно. Кроме того, значения любых опций нельзя задавать командами SetOption и Set или считывать командой Get.

        Пример 7. Здесь показано использование двух экзотических шрифтов. Первая метка выведена шрифтом Kristen ITC, заданным в самом объекте Label. Вторая метка выведена шрифтом Lucida Calligraphy ссылкой FLC на него, а сам шрифт определен как элемент объекта Maplet.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   BoxColumn(

{Shift+¿}

 

      Label("bold, 14 point, Kristen ITC",

{Shift+¿}

 

         font = Font("Kristen ITC", bold, 14)),

{Shift+¿}

 

      Label("bold, 16 point, Lucida Calligraphy",

{Shift+¿}

 

         font = FLC),

{Shift+¿}

 

   Button("OK", Shutdown())),

{Shift+¿}

 

   Font[FLC]("Lucida Calligraphy", bold, 16)):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Рисунок

        Команда Image[alias](opts) определяет объект Image (рисунок, образ). Его можно задавать в командах Button, ToggleButton, Label, CheckBox, RadioButton, Menu, MenuItem и ToolBarButton напрямую или ссылкой на псевдоним. В последнем случае объект Image должен быть непосредственно вложен в контейнер Maplet (но не в Window) и на него может быть много ссылок. Объект Image задает рисунок указанием полного пути к графическому файлу в формате jpeg или gif. Необязательный параметр alias в A – псевдоним рисунка, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       source = so. Задание полного пути доступа к файлу образа. Например, so = "C:\\qwe\\ima.jpg". Обратите внимание, что отдельные компоненты пути к файлу отделяются друг от друга сдвоенным знаком обратного слэша (\\). Если файл с указанным именем не найден, то соответствующий объект выводится без рисунка;

·       reference = ref. Назначение псевдонима для шрифта.

        Заметим, что опцию sourсe указывать обязательно (хотя бы без ключево­го слова sourсe). Кроме того, значения обеих опций нельзя задавать командами SetOption и Set или считывать командой Get.

        Пример 8.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   Image[IM1]("E:\\D_1\\Pictures\\icon019.gif"),

{Shift+¿}

 

   [[Label(image = IM1),

{Shift+¿}

 

     Button("OK", Shutdown())]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

 

 

 

Группа кнопок

        Команда ButtonGroup[alias](opts) определяет невизуальный объект, по ссылкам на псевдоним которого осуществляется объединение в группу нескольких возможно разнородных  объектов типа RadioButton, ToggleButton или RadioButtonMenuItem. Подобное объединение означает, что включение любого из объектов группы приводит к выключению ее остальных объектов. Таким образом, единовременно включенным может быть лишь один объект группы. В одном маплете может присутствовать несколько объектов типа ButtonGroup, то есть действовать сразу несколько независимых друг от друга групп кнопок. Необязательный параметр alias – псевдоним группы, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       onchange = str. Задание обработчика события “изменение состояния группы”;

·       reference = ref. Назначение псевдонима группе.

        Значения обеих опций нельзя задавать командами SetOption и Set или считывать командой Get.

        Пример 9. Здесь демонстрируется маплет с двумя независимыми группами кнопок. Первая группа смешанная. Она состоит из трех выборов Radio­ButtonMenuItem меню и двух кнопок ToggleButton. Вторая группа – это две радиокнопки RadioButton. Стрелки в маплете просто указывают на 5 кнопок первой группы. Несмотря на то, что эти кнопки разных типов, действуют они как единая группа. По кнопке “Yes” выводится список значений всех кнопок каждой из групп.

 

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(Window(layout = BR1, menubar = MB1),

{Shift+¿}

 

   BoxLayout[BR1](border = true, background = gray,

{Shift+¿}

 

      Label(StringTools[Repeat](" ", 30)),

{Shift+¿}

 

      BoxRow(Label(image = IM3), Label(image = IM2)),

{Shift+¿}

 

      BoxColumn(

{Shift+¿}

 

         ToggleButton[TB1]("4_group BG1",

{Shift+¿}

 

            value = true, group = BG1),

{Shift+¿}

 

         ToggleButton[TB2]("5_group BG1", group = BG1)),

{Shift+¿}

 

      BoxColumn(

{Shift+¿}

 

         RadioButton[RB1]("1_group BG2", group = BG2),

{Shift+¿}

 

         RadioButton[RB2]("2_group BG2",

{Shift+¿}

 

            value = true, group = BG2)),

{Shift+¿}

 

       Button("", image = IM1, width = 70, height = 45,

{Shift+¿}

 

          Shutdown([RI1, RI2, RI3, TB1, TB2, RB1, RB2]))),

{Shift+¿}

 

   ButtonGroup[BG1](),

{Shift+¿}

 

   ButtonGroup[BG2](),

{Shift+¿}

 

   MenuBar[MB1](

{Shift+¿}

 

      Menu[ME1]("1_2_3_group BG1",

{Shift+¿}

 

         RadioButtonMenuItem[RI1]("1_group BG1",

{Shift+¿}

 

            group = BG1),

{Shift+¿}

 

         RadioButtonMenuItem[RI2]("2_group BG1",

{Shift+¿}

 

            group = BG1),

{Shift+¿}

 

         RadioButtonMenuItem[RI3]("3_group BG1",

{Shift+¿}

 

            group = BG1))),

{Shift+¿}

 

   Image[IM1]("E:\\D_1\\Pictures\\button018.gif"),

{Shift+¿}

 

   Image[IM2]("E:\\D_1\\Pictures\\button026.gif"),

{Shift+¿}

 

   Image[IM3]("E:\\D_1\\Pictures\\button024.gif")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Установка опций и задание действий

        Реальную гибкость и функциональность маплетам обеспечивает возможность на этапе реализации изменять свойства их объектов и исполнять конкретные команды. Средства для этих целей предоставляются объектами SetOption – установка опций и Action задание выполняемых действий.

Установка опций

        Команда SetOption(opts, Argument(…)) устанавливает значение некоторой опции конкретного объекта в процессе выполнения маплета. Указанный объект, опция и значение задаются опциями opts. Кроме того, значение может быть задано ссылкой на его источник с помощью необязательного аргумента-объекта Argument(…). Возможные опции в SetOption таковы:

·       target = ref. Опция target значением (псевдонимом) ref ссылается на объект, значение опции которого должно быть изменено. Опцию target указывать обязательно;

·       `option` = opt. Опция `option` параметром opt задает имя изменяемой опции;

·       value = va. Опция value параметром va задает присваиваемое опции значение. По умолчанию va = “”.

        Значения опций нельзя считывать командой Get. При работе с опциями допускаются следующие сокращения: вместо target = ref, value = va можно писать ref = va; вместо target = ref, `option` = opt, value = va можно писать ref(opt) = va. Заметим, что основное различие между командами SetOption и Set в том, что первая из них использется внутри маплетов, а вторая – внутри процедур. Опции, которые могут быть установлены командой Set, можно установить и командой SetOption.

        Пример 10. Здесь демонстрируется маплет, в процессе выполнения которого изменяются значения свойств его объектов TB1 – нередактируемого поля ввода и DDB1 – комбинированного списка. Кнопка Button c надписью “Move to Output” используется для перемещения выбранного или введенного текста из поля ввода DDB1 в поле TF1. По кнопке Button c надписью “Return Outputмаплет закрывается, и возвращается текущее значение поля TF1. Перемещение текста из DDB1 в TF1 реализуется с помощью команды SetOption(target = TF1, Argument(DDB1)). Дополнительно производятся следующие действия: SetOption(target = DDB1, value = "") – поле ввода DDB1 вычищается, SetOption(TF1(background) = yellow) – фон поля TF1 становится желтым,     SetOption(TF1(font) = FO1) – назначается шрифт для поля TF1. При задании опций в SetOption везде использованы сокращения. Полные формы записи этих команд выглядят так:

        SetOptoin(target = TF1, `option` = value, Argument(source = DDB1)),

        SetOptoin(target = DDB1, `option` = value, value = ""),

        SetOption(target = TF1, `option` = background, value = yellow),

        SetOption(target = TF1, `option` = font, value = FO1).

> 

with(Maplets[Elements]):

{Shift+¿}

 

li := ["red", "gray", "gold", "blue", "green"]:

{Shift+¿}

 

mt := Maplet(Window(layout = BL1,

{Shift+¿}

 

                title = "Move (Input Field -> Output Field)"),

{Shift+¿}

 

   BoxRow[BL1](border = true, background = gray,

{Shift+¿}

 

      BoxColumn(Label("Input:"), Label("Output:")),

{Shift+¿}

 

      BoxColumn(ComboBox[DDB1](value = "gray", li),

{Shift+¿}

 

                          TextField[TF1](editable = false)),

{Shift+¿}

 

      BoxColumn(

{Shift+¿}

 

         Button("Move to Output",

{Shift+¿}

 

            Action(SetOption(target = TF1,

{Shift+¿}

 

                                         Argument(DDB1)),

{Shift+¿}

 

                       SetOption(target = DDB1, value = ""),

{Shift+¿}

 

                       SetOption(TF1(background) = yellow),

{Shift+¿}

 

                       SetOption(TF1(font) = FO1))),

{Shift+¿}

 

        Button("Return Output", Shutdown([TF1])))),

{Shift+¿}

 

   Font[FO1]("courier", bold = true, size = 16)):

{Shift+¿}

 

re := Maplets[Display](mt):

{Shift+¿}

 

if type(re, [string]) then re[1] end if;

{¿}

Задание действий

        Команда Action[alias](opts, elem) определяет невизуальный объект Action, по которому реализуются действия, предусмотренные аргументами elem. Эти аргументы представляют собой последовательность элементов Action и командных элементов типа CloseWindow, Evaluate, SetOption, RunWindow, RunDialog и Shutdown. Таким образом, объекты Action могут вкладываться друг в друга. Элементы в elem выполняются в порядке их следования. Объект Action может задаваться в объектах маплета в опциях onapprove, oncancel, onchange, onclick, ondecline и onstartup непосредственно или ссылкой на его псевдоним. Необязательные опции opts в данном случае могут быть такими:

·       reference = ref. Опция reference значением ref определяет псевдоним объекта, если он не задан параметром alias. Ни устанавливать значение опции reference по SetOption или Set, ни получать его по Get нельзя;

·       run = bo. Опцию run задавать нельзя. Ее можно определить только в SetOption или в Set. Установка run = true означает, что действия объекта Action обязаны быть выполнены сразу же по возвращении управления маплету. Это бывает полезно при организации условных закрытий окон.

        Пример 11. Здесь демонстрируется маплет с двумя графическими объектами IM1 и IM2, меткой LB1, на которую выводится графика, и тремя кнопками общего назначения с надписями pict_1, pict_2 и Ok соответственно. Кроме того, определены три объекта AC1, AC2 и AC3 типа Action. Предписанные ими действия активизируются кнопками pict_1, pict_2 и Ok. По кнопке pict_1 запускаются на выполнение действия AC1, что приводит к появлению на метке рисунка IM1. По кнопке pict_2 запускаются на выполнение действия AC2, что приводит к появлению на метке рисунка IM2. По кнопке Ok запускаются на выполнение действия AC3, что приводит к закрытию маплета.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

  [[Label[LB1](height = 90, width = 100, image = IM1),

{Shift+¿}

 

   [Button("pict_1", onclick = AC1),

{Shift+¿}

 

    Button("pict_2", onclick = AC2),

{Shift+¿}

 

    Button("Ok", onclick = AC3)]]],

{Shift+¿}

 

  Image[IM1]("E:\\D_1\\Pictures\\pict027.gif"),

{Shift+¿}

 

  Image[IM2]("E:\\D_1\\Pictures\\pict030.gif"),

{Shift+¿}

 

  Action[AC1](SetOption(LB1(image) = IM1)),

{Shift+¿}

 

  Action[AC2](SetOption(LB1(image) = IM2)),

{Shift+¿}

 

  Action[AC3](Shutdown())):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

 

 

 

Выполнение процедуры из маплета

        Команда Evaluate(opts, args) определяет невизуальный объект Evaluate, запускающий Maple-процедуру из текущей сессии с набором аргументов, заданных последовательностью args. Опции opts определяют имя выполняемой процедуры, а также задают объект и опцию, использующие возвращаемый процедурой результат. Элементы args являются объектами типа Argument, которые и определяют в порядке их следования последовательность фактических значений процедуры. Элемент Evaluate может задаваться непосредственно или ссылкой на его псевдоним в объектах маплета в опциях onapprove, oncancel, onchange, onclick, ondecline, onstartup и в объекте Action. Опции opts в данном случае могут быть такими:

·       function = pro. Опция function строкой pro определяет имя процедуры, запускаемой на выполнение, а передаваемые ей фактические аргументы задаются в args. В процедуре рекомендуется организовывать проверку типов принимаемых значений;

·       target = res. Опция target (цель) псевдонимом res задает ссылку на объект, в опции которого будет использовано значение, возвращаемое процедурой;

·       `option` = opt. Опция option значением opt задает имя опции, для которой устанавливается значение, полученное из процедуры;

·       waitforresult = bo. Опция waitforresult (ждать результата) значением bo задает режим вычислений. При bo = true вычисления по маплету приостанавливаются до завершения вычислений по процедуре. При bo = false вычисления по маплету в текущем Action-объекте продолжаются вместе с выполнением процедуры.

        Значения опций opts нельзя устанавливать командами SetOption и Set или получать командой Get.

        Замечание. Если в опции function значение pro задать литералом, то объектами Argument передавать в процедуру аргументы будет нельзя. В этом случае для выполнения, например, pro(TF) следует воспользоваться одной из следующих форм записи объекта Evaluate:

Evaluate(target = res, function = 'pro(TF)');
Evaluate(target = res, function = 'pro(TF::type)');
Evaluate(res = 'pro(TF)');

Evaluate(res = 'pro(TF::type)');

        Команда Argument(opts) определяет невизуальный объект Argument, с помощью которого объект Evaluate передает аргументы процедуре. Опции opts в данном случае могут быть такими:

·       source = res. Опция source (источник) строкой или литералом res определяет ссылку на аргумент, передаваемый процедуре. Опцию можно записывать коротко в виде ее правой части res без ключевого слова source;

·       quotedtext = bo. Опция quotedtext значением bo задает информацию о типе аргумента. При bo = true аргумент имеет тип string (например, из поля TextField или TextBox). При bo = false аргумент не имеет тип string.

        Значения опций opts нельзя устанавливать командами SetOption и Set или получать командой Get.

        Пример 12. Здесь демонстрируется выполнение процедуры ifact из маплета. По ifact с помощью команды ifactors проводится факторизация рационального числа z – дроби с целыми числителем и знаменателем. Перед этим числитель и знаменатель z сокращаются на их наибольший общий делитель. Результат возвращается в виде списка:

[signum(z), [[p1, k1], [p2, k2], …[pn, kn], [q1, -s1], [q2, -s2], …, [qm, -sm]]],

где signum(z) – знак z; pi и ki (i = 1, 2, …, n) – различные простые множители числителя z и их кратности; а qj и sj (j = 1, 2, …, m) – различные простые множители знаменателя z и их кратности.

        В маплете имеются два текстовых поля ввода TF1 и TF2, две кнопки общего назначения с надписями factor и Ok и невизуальный объект действий AC1. Работа с маплетом проводится так. В поле TF1 вводится произвольное рациональное число. По кнопке factor запускаются на выполнение действия, предусмотренные в AC1, то есть значение из TF1 передается в процедуру ifact в качестве аргумента, где проводится его факторизация. Возвращаемый процедурой результат пересылается в поле TF2. По кнопке Ok маплет закрывается, возвращая в сессию текущее значение поля TF2.

> 

ifact := proc(z::rational) ifactors(z) end proc:

{Shift+¿}

 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   BoxRow(

{Shift+¿}

 

      ["Number ?", TextField[TF1](30),

{Shift+¿}

 

         TextField[TF2](30, editable = false)],

{Shift+¿}

 

      [[Button("factor", onclick = AC1)],

{Shift+¿}

 

       [Button("Ok", Shutdown([TF2]))]]),

{Shift+¿}

 

   Action[AC1](Evaluate(

{Shift+¿}

 

      target = TF2, function = "ifact", Argument(TF1)))):

{Shift+¿}

 

ma := Maplets[Display](mt):

{Shift+¿}

 

`if`(type(ma, [string]), convert(ma[1], symbol), NULL);

{¿}

        Сделаем несколько замечаний.

        1)  В записи Evaluate можно опустить третий аргумент Argument(TF1), формируя значение из TF1 функцией GET в самой процедуре. В этом случае ifact могла бы выглядеть так:

ifact := proc()

   local n:

   n := Maplets[Tools][Get](TF1::rational);

   ifactors(n);

end proc:

        2) Объект Evaluate можно было бы записать короче в виде:

Evaluate(TF2 = 'ifact(TF1)').

        3) Можно вообще отказаться от использования процедуры ifact, непосредственно обращаясь к встроенной процедуре ifactor прямо из Evaluate, например, так:

                                       Evaluate(TF2 = 'ifactor(TF1)').

Объекты пакета Tools

        Средства подпакета Tools пакета Maplets дополняют соответствующие команды подпакета Elements. Они позволяют обрабатывать значения опций объектов маплета в процедурах (Get, Set), реализуют преобразование возвращаемых из простого списка значений к естественной форме записи (ListBoxSplit), объявляют об интересных намерениях разработчиков системы Maple (AddAttribute, AddContent) и т. д.

Обработка опций маплетов в процедурах

Получение значений опций в процедуре

        Команда Get(h, objs, opts) позволяет получать значения опций объектов запущенного на выполнение маплета. Get необходимо использоваться в процедурах, но не в определении маплета. В аргументах указываются следующие параметры: h – необязательный идентификатор маплета, objs – последовательность ссылок на объекты маплета, opts – опции объекта Get.   

       В записи элементов последовательности objs используются такие обозначения: ref – псевдоним объекта маплета, :: – символ типирования, typ – тип, opt – опция объекта, reference – ключевое слово. Элементы последовательности objs задаются и используются так:       

·       ref  – для получения значения опции value объекта ref; 

·       ref::typ – для получения значения типа typ опции value объекта ref;

·       ref(opt) – для получения значения опции opt объекта ref;

·       ref(opt)::typ – для получения значения типа typ опции opt объекта ref;

·       ref(opt)::reference – для получения значения опции opt объекта ref, причем значение должно является ссылкой на иной объект маплета.

       Опции opts объекта Get могут быть такими:

·       corrections = lo. При получении по Get данных непредусмотренного типа происходит следующее. Если lo = false, то выводится предупреждающее сообщение, закрытие которого возвращает управление маплету. Если lo = true, то выводится панель ввода с неправильными данными, которые можно корректировать. При этом принимаются любые данные требуемого типа;

·       update = lo. Здесь lo Î {true, false}.

Установка значений опций в процедуре

        Команда Set(h, objs) позволяет устанавливать значения многих опций объектов запущенного на выполнение маплета. Set необходимо использоваться в процедурах, но не в определении маплета. В аргументах указываются следующие параметры: h – необязательный идентификатор маплета, objs – последовательность ссылок на объекты маплета. Элементы последовательности objs задаются следующими способами:       

·       ref = any. ref – псевдоним объекта маплета. По ссылке устанавливается значение any опции value объекта ref; 

·       ref(opt) = any. ref – псевдоним объекта, opt – опция объекта. По ссылке устанавливается значение any опции opt объекта ref;

        Примеры 13. Здесь в программе test_1 демонстрируется использование команд Get и Set в процедуре swap обмена значениями текстовых полей TF1 и TF2. В поле TF1 могут быть введены любые данные. Но при нажатии на кнопку Swap (обмен) управление переходит к процедуре, где значения из TF1 считываются по Get с проверкой типа. Если тип окажется не алгебраическим, то вычисления по swap прерываются, и управление возвращается маплету. В противном случае выполнение swap продолжается, что приводит к обмену данных из полей TF1 и TF2, то есть значений их опций value.

        В программе test_2 поля TF1 и TF2 по Get и Set обмениваются цветами фона, то есть значениями их опций background. В отличие от test_1, в test_2 одиночные Get и Set работают со значениями требуемых опций сразу двух объектов TF1 и TF2.  

 

> 

# test_1

{Shift+¿}

 

swap := proc()

{Shift+¿}

 

local a, b:

{Shift+¿}

 

  a := Maplets:-Tools:-Get(TF1::algebraic):

{Shift+¿}

 

  b := Maplets:-Tools:-Get(TF2):

{Shift+¿}

 

  Maplets:-Tools:-Set(TF1 = b):

{Shift+¿}

 

  Maplets:-Tools:-Set(TF2 = a):

{Shift+¿}

 

end proc:

{Shift+¿}

 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

    [[[TextField[TF1](15)], [TextField[TF2](15)]],

{Shift+¿}

 

      [Button("Swap", Evaluate(function = 'swap'))]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

> 

# test_2

{Shift+¿}

 

swap1 := proc()

{Shift+¿}

 

  local a:

{Shift+¿}

 

  a := Maplets:-Tools:-Get(TF1(background),

{Shift+¿}

 

             TF2(background)):

{Shift+¿}

 

  Maplets:-Tools:-Set(TF1(background) = a[2],

{Shift+¿}

 

             TF2(background) = a[1]):

{Shift+¿}

 

end proc:

{Shift+¿}

 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

    [[[TextField[TF1](15, background = gray)],

{Shift+¿}

 

      [TextField[TF2](15)]],

{Shift+¿}

 

      [Button("Swap", Evaluate(function = 'swap1'))]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}      

        Пример 14. Здесь щелчки по кнопке BU маплета приводят к смене ее надписи. Реализуется это процедурой chan.

> 

chan := proc()

{Shift+¿}

 

   local a, b:

{Shift+¿}

 

   a := Maplets:-Tools:-Get(BU(caption)):

{Shift+¿}

 

   b := `if`(a = "Change", "New_Change", "Change"):

{Shift+¿}

 

   Maplets:-Tools:-Set(BU(caption) = b):

{Shift+¿}

 

end proc:

{Shift+¿}

 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

      [Button[BU]("Change", Evaluate(function = 'chan'))]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Дополнительные средства пакета Tools

Преобразование возвращаемых элементов списка

        Команда ListBoxSplit(obj). Возвращаемое из простого списка ListBox значение имеет вид [“a1, a2, …, am”], где ak (k = 1, 2, …, m) выделенные в списке выборы. Если выборы списка содержат символы запятой, например, “april, 25”, то в ak они заменяются последовательностью знаков ,. Делается это потому, что запятая зарезервирована как разделитель элементов ak. Принятое решение позволяет избежать коллизий, но мы встаем перед необходимостью всякий раз обрабатывать получаемые из списка значения. Впрочем, команда и создана для этих целей. По ней строка “a1, a2, …, am” преобразуется в список [“b1”, “b2”, …, “bm”], где bk получается из ak (k = 1, 2, …, m) обратной заменой слов , символом запятая.

        Замечание. В раскрывающихся списках DropDownBox и комбинированных списках ComboBox множественный выбор невозможен. В возвращаемом значении [“a”], где a = d1,d2, …,dp – конкретный элемент списка, запятые выводятся без всякой замены. Однако и здесь возможно применение к a команды ListBoxSplit. В данном случае по ней возвращается список частей a в строковом виде, то есть [“d1”, “d2”, …, “dp”].

        Пример 15. Здесь демонстрируется использование команды ListBoxSplit при работе с простым списком, выборы которого содержат символы запятой. 

> 

with(Maplets[Elements]):

{Shift+¿}

 

li := ["february, 3", "april, 9",

{Shift+¿}

 

       "september, 21", "october, 17"]:

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["Pick ?", ListBox[LB1](li)],

{Shift+¿}

 

   [Button("Ok", Shutdown([LB1])),

{Shift+¿}

 

      Button("Cancel", Shutdown())]]):

{Shift+¿}

 

re := Maplets[Display](mt);

{Shift+¿}

 

if type(re, [string] ) then

{Shift+¿}

 

   Maplets[Tools][ListBoxSplit](re[1]);

{Shift+¿}

 

end if;

{¿}

Глобальные переменные маплета

        Переменная thismaplet. Каждому запущенному на выполнение маплету присваивается некоторый уникальный натуральный идентификатор (бирка, метка). Его значение хранится в системной глобальной переменной thismaplet. При завершении работы с маплетами эта переменная становится неопределенной. 

        Переменная lastmaplet. При любом выполнении маплета a в системную глобальную переменную lastmaplet заносится его код, содержащий все опции всех объектов a, в том числе и тех, которые установлены по умолчанию. При нормальном или аварийном завершении работы с a и до запуска следующего маплета b значение переменной lastmaplet не изменяется и может быть использовано как для отладки a, так и для повторного запуска a (Display(lastmaplet)).  

        Пример 16. Здесь щелчком мыши по кнопке с надписью “Run tmap” в текстовое поле TF1 заносится идентификатор маплета.

> 

tmap := proc() thismaplet end proc:

{Shift+¿}

 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   [[TextField[TF1]()],

{Shift+¿}

 

    [Button("Run tmap", Evaluate(TF1 = tmap))]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

XML-распечатка кода маплета

        Команда Print(mt) выводит текст маплета в XML-коде. Этот текст может быть полезен, ибо в нем указаны все опции, в том числе и установленные по умолчанию. Их анализ может помочь совершенствованию функциональности и дизайна маплета.   

        Пример 17. Здесь демонстрируется фрагмент XML-распечатки простейшего маплета.

 

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(["Test"]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

> 

Maplets[Tools][Print](mt);

{¿}

Добавление новых опций и контента к объекту

        Команда AddAttribute(obj, opts) добавляет новые опции opts к ранее сконструированному объекту obj и должна использоваться до запуска маплета. Фактически по A формируются новые переменные (поля) объекта. Данное средство является пробным, и пока никакая последующая обработка добавленных опций не разрешена.

        Команда AddContent(obj, cont) добавляет контент cont к ранее сконструированному объекту obj и должна использоваться до запуска маплета. Данное средство является пробным, и пока никаких действий вставленый контент не оказывает.

        Пример 18. Здесь демонстрируется появление у текстового поля TF двух новых переменных x и y.

> 

with(Maplets[Elements]):

{Shift+¿}

 

a := TextField[TF]():

{Shift+¿}

 

b := Button("Ok", Shutdown()):

{Shift+¿}

 

Maplets[Tools][AddAttribute](a, x = true, y = "text");

{Shift+¿}

 

mt := Maplet([a, b]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

        Пример 19. Здесь демонстрируется появление у объекта Action дополнительного контента в виде объекта Shutdown().

> 

with(Maplets[Elements]):

{Shift+¿}

 

a := TextField[TF]("qwerty"):

{Shift+¿}

 

act := Action(SetOption( TF = "" ));

{Shift+¿}

 

Maplets[Tools][AddContent](act, Shutdown());

{Shift+¿}

 

b := Button[BU]("Ok", act):

{Shift+¿}

 

mt := Maplet([a, b]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}      

Загрузка и выгрузка маплет-окружения

        Команда StartEngine() загружает в оперативную память маплет-окружение, то есть совокупность основных средств, обеспечивающих работу с маплетами. Если выполнить A до запуска маплета, то впоследствии время разворачивания его начального окна на экране уменьшается. В запущенном маплете по A никаких действий не производится.

        Команда StopEngine() выгружает из оперативной памяти маплет-окружение, завершая работу с маплетами.

         Примеры 20.

> 

with(Maplets[Tools]):

{Shift+¿}

 

StartEngine();

{¿}

> 

with(Maplets[Tools]):

{Shift+¿}

 

StopEngine();

{¿}